/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.ArrayList;
import modelo.Usuario;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;


public class UsuarioDAO {
	private EntityManager em;
        private Pattern pattern = null; 
        private Matcher matcher;
        
	public UsuarioDAO(){
		this.em = Persistence.createEntityManagerFactory("SigepiUP").createEntityManager();
	}
	
	public void inserir(Usuario usuario){
	    em.getTransaction().begin();
            em.persist(usuario);
            em.getTransaction().commit();
	}     
	
	public ArrayList<Usuario> getLista() {
            Collection <Usuario> lista = em.createQuery("from Usuario").getResultList();
            ArrayList<Usuario> alUsuario = new ArrayList<Usuario>();
            
            for (Usuario usuario : lista){
                    alUsuario.add(usuario);		    			
            }
            return alUsuario;
        }              
           
        public Usuario getUsuario(int id) {
            Usuario usuario = em.find(Usuario.class, id);
            return usuario;
        }
            
        public void remover(int id){
            Usuario usuario = getUsuario(id);            
            em.getTransaction().begin();
            em.merge(usuario);
            em.remove(usuario);
            em.getTransaction().commit();                    
        }
        
        public void remover(Usuario usuario){
            remover(usuario.getId());                            
        }
    
        public void atualizar(Usuario usuario) {
            em.getTransaction().begin();            
            em.getTransaction().commit();        
        }
        
        public void duplicar(Usuario usuario) {
            Usuario usuarioDuplicado = new Usuario();
            usuarioDuplicado.setNome(usuario.getNome());
            usuarioDuplicado.setLogin(usuario.getLogin());
            usuarioDuplicado.setSenha(usuario.getSenha());
            usuarioDuplicado.setTipo(usuario.getTipo());
            inserir(usuarioDuplicado);            
        }
        
        public ArrayList<Usuario> pesquisarNome(String nome) {        
            pattern = Pattern.compile(nome, Pattern.CASE_INSENSITIVE);
            ArrayList<Usuario> alUsuario = new ArrayList<Usuario>();
            ArrayList<Usuario> alUsuarioAux = getLista();      
            
            for (int k=0; k < alUsuarioAux.size(); k++) {
                    matcher = pattern.matcher(alUsuarioAux.get(k).getNome());              
                    if (matcher.find()) {
                        alUsuario.add(alUsuarioAux.get(k));                   
                    }
            }
            alUsuarioAux.clear();
            return alUsuario;
        }
        
        public ArrayList<Usuario> pesquisarLogin(String login) {
            pattern = Pattern.compile(login, Pattern.CASE_INSENSITIVE);
            ArrayList<Usuario> alUsuario = new ArrayList<Usuario>();
            ArrayList<Usuario> alUsuarioAux = getLista();      
            
            for (int k=0; k < alUsuarioAux.size(); k++) {
                    matcher = pattern.matcher(alUsuarioAux.get(k).getLogin());              
                    if (matcher.find()) {
                        alUsuario.add(alUsuarioAux.get(k));                   
                    }
            }
            alUsuarioAux.clear();
            return alUsuario;    
        }
        
        public ArrayList<Usuario> pesquisarTipo(String tipo) {
            pattern = Pattern.compile(tipo, Pattern.CASE_INSENSITIVE);
            ArrayList<Usuario> alUsuario = new ArrayList<Usuario>();
            ArrayList<Usuario> alUsuarioAux = getLista();      
            
            for (int k=0; k < alUsuarioAux.size(); k++) {
                    matcher = pattern.matcher(alUsuarioAux.get(k).getTipo());              
                    if (matcher.find()) {
                        alUsuario.add(alUsuarioAux.get(k));                   
                    }
            }
            alUsuarioAux.clear();
            return alUsuario;    
        }       
}